package cn.t.repository.impl.user;

import cn.t.converter.user.UserQueryConverter;
import cn.t.converter.user.UserQueryUnquotedConverter;
import cn.t.core.mode.YesNoEnum;
import cn.t.core.repoistory.RepositoryImpl;
import cn.t.model.user.UserQueryDO;
import cn.t.persistence.entity.user.UserQueryPO;
import cn.t.persistence.mapper.user.UserQueryManualMapper;
import cn.t.persistence.mapper.user.UserQueryMapper;
import cn.t.repository.user.UserQueryRepository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 用户信息表数据仓库
 *
 * @author l
 */
@Slf4j
@Repository
@AllArgsConstructor
public class UserQueryRepositoryImpl extends RepositoryImpl<UserQueryMapper, UserQueryPO, UserQueryConverter, UserQueryDO> implements UserQueryRepository {


    @Override
    public List<UserQueryDO> findByModel(UserQueryDO userQueryDO, int start, Integer pageSize, String field, String direction) {

        List<UserQueryPO> list = userQueryManualMapper.findByModel(converter.model2Po(wrapper(userQueryDO)), start, pageSize, field, direction);

        return list.stream().map(unquotedConverter::po2ModelUnQuoted).collect(Collectors.toList());
    }

    @Override
    public long count(UserQueryDO userQueryDO) {
        return userQueryManualMapper.count(converter.model2Po(wrapper(userQueryDO)));
    }

    @Override
    public boolean removeById(Long userId) {
        return getBaseMapper().removeById(userId);
    }


    public UserQueryDO wrapper(UserQueryDO userQueryDO) {

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getFirmCode()) && !ObjectUtils.isEmpty(userQueryDO.getRoleId())) {
            userQueryDO.setFirmRoleId(userQueryDO.getFirmCode() + "_" + userQueryDO.getRoleId());
            userQueryDO.setRoleId(null);
        }
        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getFirmCode()) && StringUtils.isNotBlank(userQueryDO.getRoleCode())) {
            userQueryDO.setFirmRoleCode(userQueryDO.getFirmCode() + "_" + userQueryDO.getRoleCode());
            userQueryDO.setRoleCode(null);
        }
        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getFirmCode()) && !ObjectUtils.isEmpty(userQueryDO.getRoleType())) {
            userQueryDO.setFirmRoleType(userQueryDO.getFirmCode() + "_" + userQueryDO.getRoleType());
            userQueryDO.setRoleType(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getFirmCode()) && StringUtils.isNotBlank(userQueryDO.getCostCenterCode())) {
            userQueryDO.setFirmCostCenterCode("%" +userQueryDO.getFirmCode() + "_" + userQueryDO.getCostCenterCode()+ "%");
            userQueryDO.setCostCenterCode(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getFirmCode()) && !ObjectUtils.isEmpty(userQueryDO.getCostCenterId())) {
            userQueryDO.setFirmCostCenterId("%" +userQueryDO.getFirmCode() + "_" + userQueryDO.getCostCenterId()+"%" );
            userQueryDO.setCostCenterId(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getCardCode())) {
            userQueryDO.setCardCode("\"" + userQueryDO.getCardCode().trim() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setCardCode(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getPhoneNumber())) {
            userQueryDO.setPhoneNumber("\"" + userQueryDO.getPhoneNumber().trim() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setPhoneNumber(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getEmployeeCode())) {
            userQueryDO.setEmployeeCode("\"" + userQueryDO.getEmployeeCode().trim() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setEmployeeCode(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getUserName())) {
            userQueryDO.setUserName("\"" + userQueryDO.getUserName().trim() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setUserName(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getIndividualName())) {
            userQueryDO.setIndividualName("\"" + userQueryDO.getIndividualName().trim() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setIndividualName(null);
        }

        if (userQueryDO != null && userQueryDO.getFirmId() != null) {
            userQueryDO.setFirmId(userQueryDO.getFirmId());
        } else if (userQueryDO != null) {
            userQueryDO.setFirmId(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getScenarioCode())) {
            userQueryDO.setScenarioCode("%" + userQueryDO.getScenarioCode() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setScenarioCode(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getFirmCode())) {
            userQueryDO.setFirmCode("%" + userQueryDO.getFirmCode().trim() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setFirmCode(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getFirmName())) {
            userQueryDO.setFirmName("%" + userQueryDO.getFirmName().trim() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setFirmName(null);
        }

        if (userQueryDO != null && userQueryDO.getCostCenterId() != null) {
            userQueryDO.setCostCenterId(userQueryDO.getCostCenterId());
        } else if (userQueryDO != null) {
            userQueryDO.setCostCenterId(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getCostCenterCode())) {
            userQueryDO.setCostCenterCode("%" + userQueryDO.getCostCenterCode().trim() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setCostCenterCode(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getCostCenterName())) {
            userQueryDO.setCostCenterName("%" + userQueryDO.getCostCenterName().trim() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setCostCenterName(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getRoleName())) {
            userQueryDO.setRoleName("%" + userQueryDO.getRoleName().trim() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setRoleName(null);
        }

        if (userQueryDO != null && StringUtils.isNotBlank(userQueryDO.getRoleCode())) {
            userQueryDO.setRoleCode("%" + userQueryDO.getRoleCode().trim() + "%");
        } else if (userQueryDO != null) {
            userQueryDO.setRoleCode(null);
        }

        if (userQueryDO != null && userQueryDO.getIsDeleted() == null) {
            userQueryDO.setIsDeleted(YesNoEnum.FALSE);
        }

        return userQueryDO;
    }

    @Autowired
    private UserQueryManualMapper userQueryManualMapper;

    @Autowired
    private UserQueryUnquotedConverter unquotedConverter;


}
